package com.njts.extend;

/**
 * @author David GE
 * Date  2025/11/19
 * 设计一个医务室的挂号系统,有三类用户使用它
 * admin patient doctor nurse -->User
 * 耦合度过高->难以维护
 * 不方便扩展,对于新加入的角色(nurse),需要修改所有用户的属性和方法
 * 有被浪费的空间->复用率低
 * //继承->继承机制 对于类的扩展(extend)
 * 面向对象程序设计中有哪些设计原则?
 * 1开闭原则 对扩展开放,对修改关闭
 * 注解1(属性的扩展开放,修改关闭)
 * 注解2:修改->直接从的类的外部修改成员变量(主动权掌握在自己手里)
 * 注解3 开放?是否代表无限制的开放?对于私有成员(变量,方法)不开放
 */
public class User {
    private int id;
    private String username;

    private String password;
    private int age;
    private String phone;
    private String gender;
    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }
    private void seeInfo(){
        System.out.println("这是用户的隐私,只能自己看");
    }
    // 受保护的  角色
    protected String role;
    public User(){
        System.out.println("创建user对象");
    }
    public User(String username,String password){
        this();
        this.username=username;
        this.password=password;
        System.out.println(this.username+"密码为"+this.password);
    }
    public void register(String username,String password){
        this.username=username;
        this.password=password;
        System.out.println(username+"注册成功");
    }
}


class Patient extends User{
    // User 被称为父类,超类(super)
    //Patient 称为子类
    //用extends关键字连接的两个类间存在继承关系
    // 继承带来什么好处?
    // 1 不用在子类重复定义父类中已有的属性和方法(Private关键字修饰的除外)
    // 2 将子类对象的属性与方法与父类区分开来,使功能更加明确
    // 子类对象要"做自己"
    // 门诊号

    private String RegisterId;
    // 疾病
    private String disease;
    // 诊断记录
    private String diagnoseRecord;

    public String getRegisterId() {
        return RegisterId;
    }

    public void setRegisterId(String registerId) {
        RegisterId = registerId;
    }

    public String getDisease() {
        return disease;
    }

    public void setDisease(String disease) {
        this.disease = disease;
    }

    public String getDiagnoseRecord() {
        return diagnoseRecord;
    }

    public void setDiagnoseRecord(String diagnoseRecord) {
        this.diagnoseRecord = diagnoseRecord;
    }
    public Patient(){
        // 显式调用super()构造方法时,一定写在方法的第一行!!!!!
        super();
        System.out.println("父类方法");
        // 先父后子:在初始化子类对象之前,必定会先初始化父类

    }
}

class Doctor extends User{
    // 职称
    private String position;
    // 简介
    private String desc;
    // 科室
    private String typeName;

    public String getPosition() {
        return position;
    }

    public void setPosition(String position) {
        this.position = position;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getTypeName() {
        return typeName;
    }

    public void setTypeName(String typeName) {
        this.typeName = typeName;
    }
    public String getRole(){
        return role;
    }
}
//Java中能否实现多继承? 不能:类和类不存在多继承关系(派生类)
//class Admin extends User,Doctor{
class Admin extends Doctor{
    // 等级
    private String  level;
    // 状态
    private int status;

    public String getLevel() {
        return level;
    }

    public void setLevel(String level) {
        this.level = level;
    }

    public int getStatus() {
        return status;
    }

    public void setStatus(int status) {
        this.status = status;
    }
    // 方法重写:在具有继承关系的子父类中,子类重新定义分类的行为而对父类方法进行重新复写
    //方法重写的格式:
    // 1 访问修饰符:子类方法>=父类方法
    // 2 返回值相同
    // 3 方法名相同
    // 4 参数列表相同
    @Override//注解:方法为重写的方法
    public void register(String username,String password){
            // super                    this
        //使用    父类方法和属性         本身的方法和属性
        //构造    调用父类构造,写在方法的第一行   本身构造方法的调用,写在方法的第一行
        super.register(username,password);//super.调用父类的属性与方法
        this.role = "管理员";
        System.out.println("当前用户角色是"+this.role);
    }
}